27−20 ユ−ザ−フォ−ムを使用した抽出
5年以上前にExcel5.0で検索マクロを作成し、「10-1項オートフィルター機能による検索」
へ掲載しています。このマクロ自体はExcel操作の初心者も含め社内では毎日数十名以上が
利用し大変重宝がられています。ひさしぶりにソ−スを見たらGoSub...Returnステ−トメント
を使用する等ExcelVBAでは一般的にほとんど使用されなくなったステ−トメントで組んで
あり、多分最近VBAを始めた方は判りずらいと思う。
そこで今回、一部改善しExcel2000で作り直しました。
・このマクロは(1)〜(5)を同じ標準モジ−ルへ貼り付ければ使用できます。
・アクティブシ−トのデ−タベ−スを対象に実行します。
・「検索」ボタンは"Sub ダイアログ()"を一度実行して「解除」で出来ます。
・検索文字として、ワイルドカ−ド「?、*」も使用可。
・検索する条件が2個の場合、"OR"又は"AND"を使用(前後スペ−スが必要)
・数字・日付のアイテムは大・少(<>)の条件指定可。
・大文字・小文字を区別しないで抽出する。
(1) 検索キ−ワ−ド入力ユ−ザ−フォ−ムの表示
Sub ダイアログ()
Application.ScreenUpdating = False
sname = ActiveSheet.Name
' オ−トフィルタ−解除
Application.Worksheets(sname).Activate
ActiveSheet.AutoFilterMode = False
UserForm1.Show
End Sub
(2) ユ−ザ−フォ−ムからのデ−タ取得とデ−タ検索
下図は"Sub 検出結果()"プロシ−ジャ実行前の図。
Sub 検索()
' ダイアログのデ−タ入力
dat = UserForm1.txt1.Text
If UserForm1.opt1.Value = True Then
kom = 1: ms1$ = "項目"
ElseIf UserForm1.opt2.Value = True Then
kom = 2: ms1$ = "品名"
ElseIf UserForm1.opt3.Value = True Then
kom = 3: ms1$ = "数量"
ElseIf UserForm1.opt5.Value = True Then
kom = 4: ms1$ = "配膳"
ElseIf UserForm1.opt5.Value = True Then
kom = 5: ms1$ = "組立"
ElseIf UserForm1.opt6.Value = True Then
kom = 6: ms1$ = "点検"
Else
MsgBox "検索するアイテムを指定して下さい"
Exit Sub
End If
'
'データ2個検索
op = 0: data = 0: datb = 0
data = InStr(1, dat, " or", 1)
datb = InStr(1, dat, " and", 1)
If data > 1 Then
op = 1
dat1 = Trim(Mid(dat, 1, data - 1))
dat2 = Trim(Mid(dat, data + 3))
End If
If datb > 1 Then
op = 2
dat1 = Trim(Mid(dat, 1, datb - 1))
dat2 = Trim(Mid(dat, datb + 4))
End If
UserForm1.Hide
'
'デ−タ検索
Application.Worksheets(sname).Activate
Range("a1").Select
If op = 1 Then
Selection.AutoFilter Field:=kom, Criteria1:=dat1, _
operator:=xlOr, criteria2:=dat2
ElseIf op = 2 Then
Selection.AutoFilter Field:=kom, Criteria1:=dat1, _
operator:=xlAnd, criteria2:=dat2
Else
Selection.AutoFilter Field:=kom, Criteria1:=dat
End If
'
If ActiveSheet.Buttons.Count = 1 Then
ActiveSheet.Buttons.Select
nam = Selection.Name
ActiveSheet.Buttons(nam).Select
Selection.Delete
End If
ActiveSheet.Buttons.Add(340.5, 1.5, 31.5, 14.25).Select
Selection.OnAction = "解除"
Selection.Characters.Text = "解除"
Range("A1").Select
検出結果
End Sub
(3) 検出結果の処理
・このマクロでフイルタ−が掛かり「解除」ボタンが付く。
・下図「はい」で(4)項に進む。
・下図「いいえ」で最初の状態に戻る。
・下図「キャンセル」でフイルタ−の掛かった状態。
・「解除」ボタンをクリックで、最初状態に戻り「検索」ボタンが付く。
Sub 検出結果()
Application.ScreenUpdating = True
ms3$ = ""
ms2$ = "を検索しました。" & Chr$(10) & _
"この結果を「検索結果」シ−トへコピ−しますか?"
ta = MsgBox("[" & ms1 & "]" & "の 「" & dat & "」 " & ms2$, 3, "検索結果")
Application.ScreenUpdating = False
If ta = 2 Then
Exit Sub
ElseIf ta = 7 Then ' オ−トフィルタ−解除
ActiveSheet.AutoFilterMode = False
ActiveSheet.Buttons.Select
nam = Selection.Name
ActiveSheet.Buttons(nam).Select
Selection.Delete
ActiveSheet.Buttons.Add(340.5, 1.5, 31.5, 14.25).Select
Selection.OnAction = "ダイアログ"
Selection.Characters.Text = "検索"
Range("A1").Select
Exit Sub
Else
コピイ
End If
End Sub
(4) 検索結果の貼り付け方法指定
・このマクロで抽出した結果を検索結果シ−トへ貼り付ける。
・下図の「はい」で新しいデ−タは、前に貼り付けた下へ追加される。
・下図の「いいえ」で新しいデ−タのみ貼り付けられる。
Sub コピイ()
'シ−トの有無チェック
sck = 0
For Each sheet_name In Worksheets
If sheet_name.Name = ("検索結果") Then
sck = 1
Exit For
End If
Next
' シートの追加
If sck = 0 Then
Sheets.Add.Name = "検索結果"
End If
ms2$ = "前回検索の下へ追加しますか。"
tb = MsgBox(ms2$, 4, "検索結果の表示")
If tb = 7 Then
If sck = 1 Then
Application.DisplayAlerts = False
Sheets("検索結果").Delete
Application.DisplayAlerts = True
Sheets.Add.Name = "検索結果"
Range("A1").Select
End If
cen3 = 1
Else
Sheets("検索結果").Select
Selection.SpecialCells(xlCellTypeLastCell).Select
cen3 = ActiveCell.Row
End If
' セル数のチェック
Sheets(sname).Select
ccc = 0
Range("a1").CurrentRegion.SpecialCells(xlCellTypeVisible).Select
For Each sel In Selection.Areas
ccc = ccc + sel.Rows.Count
Next sel
ms3 = "----- " & ccc - 1 & "個抽出"
If ccc = 1 Then
Sheets("検索結果").Select
ms3 = "--------- DATA無し"
最終処理
Exit Sub
End If
' コピ−
Range("A1").CurrentRegion.Copy
' 貼り付け
Sheets("検索結果").Select
Application.Cells(cen3 + 1, 1).Select
ActiveSheet.Paste
'
最終処理
Exit Sub
End Sub
(5) 検索結果を別シ−トへ貼り付けた例
・抽出個数の貼付け。
・フィルタ−の解除。
Sub 最終処理()
Range("a1").Select
Selection.CurrentRegion.Select
cen4 = Selection.Rows.Count
Range("a1").Select
Cells(cen4 + 1, 1) = "[" & ms1$ & "]" & "--- 「" & dat & "」 " & "の検索結果" & ms3
Cells(cen4 + 2, 1) = "."
' オ−トフィルタ−解除
Application.Worksheets(sname).Activate
ActiveSheet.AutoFilterMode = False
ActiveSheet.Buttons.Select
nam = Selection.Name
ActiveSheet.Buttons(nam).Select
Selection.Delete
ActiveSheet.Buttons.Add(340.5, 1.5, 31.5, 14.25).Select
Selection.OnAction = "ダイアログ"
Selection.Characters.Text = "検索"
Range("A1").Select
Application.CutCopyMode = fales
Application.Worksheets("検索結果").Activate
Range("A1").Select
End Sub
'
Sub 解除()
' オ−トフィルタ−解除
Application.Worksheets(sname).Activate
ActiveSheet.AutoFilterMode = False
ActiveSheet.Buttons.Select
nam = Selection.Name
ActiveSheet.Buttons(nam).Select
Selection.Delete
ActiveSheet.Buttons.Add(340.5, 1.5, 31.5, 14.25).Select
Selection.Characters.Text = "検索"
Selection.OnAction = "ダイアログ"
Range("A1").Select
End Sub
目次へ戻る